package lock;

/**
 * @program: Dome
 * @description:
 * @className: TestWaiting
 * @author: rjt99999
 * @version: 1.0.0
 * @create: 2020-08-02 21:05
 **/
public class TestWaiting {


    //线程的通信-wait/notify 就是线程间的一种协作机制

    //object  的 Object.wait 方法 和 Object.notify()方法 或 Object.notifyAll()方法

    /*
    当多个线程协作时，比如A，B线程，如果A线程在Runnable（可运行）状态中调用了wait()方法那么A线程就进入 了Waiting（无限等待）状态，同时失去了同步锁。
    假如这个时候B线程获取到了同步锁，在运行状态中调用了 notify()方法，那么就会将无限等待的A线程唤醒。
    注意是唤醒，如果获取到锁对象，那么A线程唤醒后就进入 Runnable（可运行）状态；如果没有获取锁对象，那么就进入到Blocked（锁阻塞状态）
     */

    public static Object object = new Object();

    public static void main(String[] args) {

        //线程waiting
        new Thread(() -> {

            while (true) {

                synchronized (object) {


                    try {

                        System.out.println(Thread.currentThread().getName() + "： 等。。。。。。。。。");

                        object.wait();

                    } catch (InterruptedException e) {

                        e.printStackTrace();
                    }


                    System.out.println(Thread.currentThread().getName() + "： 执行了。。。。。。。。。。。。");
                }
            }
        }, "等待线程").start();


        //唤醒线程
        new Thread(() -> {

            while (true) {


                try {

                    System.out.println(Thread.currentThread().getName() + "： 唤醒。。。。。。。。。");

                    Thread.sleep(3000);//等待3秒 唤醒

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }
                //同步代码块，保证只有锁对象 能调取唤醒方法
                //也是保证只有一个线程，对数据有写入
                synchronized (object) {

                    object.notify();
                    System.out.println(Thread.currentThread().getName() + "： 释放锁。。。。。。。。。。。。");
                }

            }
        }, "唤醒线程").start();


    }


}
